<?php
declare (strict_types = 1);

namespace app\admin\controller;

use app\admin\model\GoodsPics;
use app\BaseController;
use think\exception\ValidateException;
use think\facade\Cache;
use think\facade\Session;
use think\facade\View;
use think\Request;
use think\facade\Db;

class Goods extends BaseController
{
    /**
     * 商品列表
     */
    public function goodsList(Request $request){

        # 配置数据库、成功以后、查询商品列表
//        $info = \app\admin\model\Goods::find(32);
        # 查询所有的数据
//        $data = \app\admin\model\Goods::select();

        # 接收搜索条件
        $goods_name = $request->get('goods_name');

        # 分页查询数据 或者创建时间、其他字段
        $data = \app\admin\model\Goods::where('goods_name','like',"%$goods_name%")->order('id','desc')->paginate([
            'list_rows' => 5,// 分页数量
            'query' => [
                'goods_name' => $goods_name
            ],//url额外的参数、将搜索条件追加页码后面 格式是数组格式
        ]);

        # 统计数据的用法
        # 查询数据库所有的商品数量 求总数量
        $count = \app\admin\model\Goods::count('id');
        # 查询数据库商品价格最高的商品
        $max = \app\admin\model\Goods::max('goods_price');
        # 最低的金额
        $min = \app\admin\model\Goods::min('goods_price');

        # 统计所有商品库存 求和
        $sum = \app\admin\model\Goods::sum('goods_number');

        # 平均值
        $avg = \app\admin\model\Goods::avg('goods_price');

        View::assign('sum',$sum);
        # 搜索的条件、返回给视图
        View::assign('goods_name',$goods_name);
        # 调试、打印
//        dd($data);
        # 将查询到的数据、赋值到模版
        View::assign('data',$data);

        return View::fetch();
    }


    /**
     * 删除
     */
    public function  goodsDel(){
        $id = \request()->get('id');
        if (!is_numeric($id)) {
            dd("删除的标示、只能是数字");
        }

        # 删除操作 （商品上架的、不能进行删除）
        $info = \app\admin\model\Goods::find($id);
        if (empty($info)) {
            dd("该商品不存在");
        }
        if ($info->goods_status == 1) {
            dd("商品已上架、不能进行删除");
        }

        $res = $info->delete();
        if ($res) {
            return redirect('/admin/goodsList');//重定向到列表页面
        } else {
            dd("删除失败");
        }
    }

    /**
     * 批量删除
     */
    public function goodsBatchDel(){

        $ids = \request()->post('ids');
        if (count($ids) == 0) {
            return json(['data' =>[],'code' => 2001,'msg' => '参数错误']);
        }
        $goods = \app\admin\model\Goods::whereIn('id',$ids)->select();
        if (empty($goods)) {
            return json(['data' =>[],'code' => 2001,'msg' => '商品不存在']);
        }

        foreach ($goods as $value) {
            if ($value->goods_status == 1) {
                return json(['data' =>[],'code' => 2001,'msg' => '删除的商品中有商品已上架、不能进行删除']);
            }
        }

        \app\admin\model\Goods::destroy($ids);
        return  json(['code' => 200,'msg' => 'ok','data' => []]);
    }


    /**
     * 展示添加页面
     */
    public function goodsAdd(){
        return View::fetch();
    }

    /**
     * 保存入库
     * 怎么保证两张入库数据一致？
     */
    public function goodsSave(){

        // 启动事务
        Db::startTrans();
        try {

            # 接收所有的参数 request() 框架提供助手函数
            $all = \request()->all();
            $all['goods_name'] = trim($all['goods_name']);
            $rule = [
                'goods_name' => 'require|unique:goods,goods_name',
                'goods_logo' => 'require|fileExt:png,jpg,jpeg|fileSize:20480000',
                'goods_number' => 'require|number',
                'goods_price' => 'require|float'
            ];//验证规则
            $message = [
                'goods_name.require' => '商品名称必填',
                'goods_name.unique' => '商品名称必须唯一',
                'goods_logo.require' => '商品logo必填',
                'goods_number.number' => '商品库存只能是数字',
                'goods_price.float' => '商品库存只能是浮点数',
            ];//错误提示
            $result = $this->validate($all,$rule,$message);

            // 获取表单上传文件 例如上传了001.jpg（单图片）
            $file = request()->file('goods_logo');
            // 上传到本地服务器
            $savename = \think\facade\Filesystem::disk('public')->putFile( 'goods_logo', $file);

            // 文字水印

            // 多图片上传
            $files = \request()->file('goods_pics');
            $path = [];
            foreach ($files as $value) {
                $path[] = \think\facade\Filesystem::disk('public')->putFile( 'goods_pics', $value);
            }

            $data = [
                'goods_name' => $all['goods_name'],
                'goods_price' => $all['goods_price'],
                'goods_number' => $all['goods_number'],
                'goods_introduce' => $all['goods_introduce'],
                'goods_logo' => '/'.$savename,
                'create_time' => time(),
            ];
            $goods = \app\admin\model\Goods::create($data);
            $goods_id = $goods->id;
            # 构造相册入库的数据
            $goods_pics = [];
            foreach ($path as $item) {
                // 制作缩略图
                $info = pathinfo($item);
                $image = \think\Image::open('./'.$item);
                $thumb_name = './'.$info['dirname'].'/'.$info['filename'].'_thumb.'.$info['extension'];
                $image->thumb(150,150)->save($thumb_name);

                $goods_pics[] = [
                    'goods_id' => $goods_id,
                    'pics_big' => '/'.$item,
                    'pics_sma' => $thumb_name
                ];
            }

            (new GoodsPics())->saveAll($goods_pics);

            // 提交事务
            Db::commit();
            
            return redirect('/admin/goodsList');

        }catch (ValidateException $validateException) {
            // 回滚事务
            Db::rollback();
            dd($validateException->getError());
        }catch (\Exception $exception) {
            // 回滚事务
            Db::rollback();
            dd($exception->getMessage());
        }

    }

    /**
     * 展示编辑页面
     */
    public function goodsEditor($id){
        return View::fetch();
    }

    /**
     * wangEditor编辑器上传的地址
     */
    public function uploadImage(){
        $return = [
            'errno' => 0,
            'data' =>[]
        ];
        $files = \request()->file();
        foreach ($files as $file) {
            $savename = \think\facade\Filesystem::disk('public')->putFile( 'wangEditor', $file);
            $return['data'][] = [
                'url' => '/'.$savename,
                'alt' => '商品详情',
                'href' => ''
            ];

        }
        return json($return);

    }


    /**
     * 公共函数
     * 使用自定义的公共方法
     */
    public function common(){
        // 调用自定义函数 方法名()
        return add(1,1);
    }

}
